package org.basis.algorithm.bitoperation;

/**
 * 使用int类型来表示位，进行位相关运算
 *
 * @author Mr_wenpan@163.com 2022/01/04 15:51
 */
public class IntExpressBit {

    public static void main(String[] args) {
        getNumStatus(1);
        String res = replaceSpaces("Mr John   Smith    ", 13);
        System.out.println(res);
    }

    public static String replaceSpaces(String S, int length) {
        if (S == null || length < 0) {
            return null;
        }
        String str = S.substring(0, length);
        str = str.replace(" ", "%20");
        return str;
    }

    /**
     * 假设用一个1000长度的int数组来进行位操作，可表示的位范围是 0 ~ 1000 * 32
     */
    static int[] array = new int[1000];

    /**
     * 获取到第num位上的状态
     */
    public static int getNumStatus(int num) {

        // 请你获取到num位的状态（第num位上是0还是1）
        // 找到第num位，存在于array数组的第几个位置（每个整形占32位）
        int position = num / 32;
        // array[position] 这个数里在第几位
        int bit = num % 32;
        int temp = array[position];
        // 左移bit便让第178位上的1移动到了最右边，然后再 & 1就得出了这个位置上是0还是1了
        int res = (temp >> bit) & 1;
        System.out.println("第num位上的状态是：" + res);
        return res;
    }

    /**
     * 将第num位置置为1
     */
    public static void changeTo1(int num) {
        int position = num / 32;
        int bitIndex = num % 32;
        // 更改第num位为1
        // 1左移bitIndex位，这里应该是左移（32 - bitIndex）
        array[position] = (1 << (32 - bitIndex)) | array[position];
    }

    /**
     * 将第num位置置为0
     */
    public static void changeTo0(int num) {
        int position = num / 32;
        int bitIndex = num % 32;

        // 先将1左移bitIndex位，然后取反
        array[position] = array[position] & (~(1 << (32 - bitIndex)));
    }


}
